﻿using System;
using System.Data.SqlClient;
using System.Globalization;

public partial class Services_CrearCuenta : System.Web.UI.Page
{
    private String _UserType;
    private String _MatriculaNominaString;

    protected void Page_Load(object sender, EventArgs e)
    {
        if (Session["UsuarioStatus"] != null)
        {
            UsuarioStatusLabel.Visible = true;
            UsuarioStatusLabel.Text = (String)Session["UsuarioStatus"];
            Session.Remove("UsuarioStatus");
        }

        if (Session["SessionID"] == null)
        {
            // TRUE: Es un Guest, se despliega la información para registrar cuenta Alumno
            // Máximo valor para el año de nacimiento del alumno (debe ser mayor de 15 años)
            LegendUserCreation.InnerHtml = "<strong>Crear cuenta para Solicitud de Beca de Filantrop&iacute;a</strong>";
            MatriculaNomina.Text = "Matr&iacute;cula:";
            AddOnSpan.InnerHtml = "A0";
            RegExpMatriculaNomina.ErrorMessage = "Matr&iacute;cula incorrecta.";
            RequiredMatriculaNomina.ErrorMessage = "Matr&iacute;cula no puede ser un campo vac&iacute;o.";
            AlumnoFechaNacimientoDiv.Visible = true;
            _UserType = "Alumnos";
            _MatriculaNominaString = "Matricula";
        }
        else
        {
            if (IsAdmin() && IsSuperAdmin())
            {
                LegendUserCreation.InnerHtml = "<strong>Crear cuenta de Administrador</strong>";
                MatriculaNomina.Text = "N&oacute;mina:";
                AddOnSpan.InnerText = "L0";
                RegExpMatriculaNomina.ErrorMessage = "N&oacute;mina incorrecta.";
                RequiredMatriculaNomina.ErrorMessage = "N&oacute;mina no puede ser un campo vac&iacute;o.";
                AlumnoFechaNacimientoDiv.Visible = false;
                RequiredFechaNacimiento.Visible = false;
                FechaNacimientoTextBox.Visible = false;
                _UserType = "Administradores";
                _MatriculaNominaString = "Nomina";
                CancelarCuentaButton.Visible = true;
            }
            else
            {
                Session.Clear();
                Session.Abandon();
                Session.RemoveAll();
                Response.Redirect("~/Default.aspx");
            }

        }
    }


    // Se cancela la creación de la cuenta
    protected void CancelarCreacionCuenta(object sender, EventArgs e)
    {
        Response.Redirect("~/AdminCP/Cuentas.aspx");
    }


    // Para generar una cuenta nueva
    protected void CrearCuentaClick(object sender, EventArgs e)
    {
        Validate();
        if (!Page.IsValid) return;
        String MatriculaNominaId = AddOnSpan.InnerText + MatriculaNominaTextBox.Text;
        DatabaseConnection dbCon = new DatabaseConnection();


        // Como el nombre de la Tabla no se puede parametrizar, se hace un check que la
        // variable _UserTable contenga los únicos dos valores posibles
        if (!String.Equals(_UserType, "Alumnos") && !String.Equals(_UserType, "Administradores"))
        {
            Session["UsuarioStatus"] =
                "<div class='alert alert-error' align='center'><strong>Acci&oacute;n denegada por seguridad</strong></div>";
            Response.Redirect("~/Services/CrearCuenta.aspx");
        }

        // Se crea un Query Parametrizado
        String ParameterizedQueryString = String.Format("SELECT {0} FROM " + _UserType + " WHERE {0} = @MatriculaNominaId", _MatriculaNominaString);
        SqlCommand ParameterizedQuery = new SqlCommand(ParameterizedQueryString);
        ParameterizedQuery.Parameters.Add(new SqlParameter("@MatriculaNominaId", MatriculaNominaId));

        // Verifica que el usuario no esté registrado previamente
        using (SqlDataReader createReader = dbCon.ParameterizedExecuteSelect(ParameterizedQuery))
        {
            if (createReader.Read() &&
                String.Equals(MatriculaNominaId, (String) createReader[_MatriculaNominaString]))
            {
                // Se niega el nuevo registro

                createReader.Close();
                dbCon.CloseConnection();

                if (IsSuperAdmin())
                {
                    Session["UsuarioStatus"] =
                        "<div class='alert alert-error' align='center'><strong>No se puede crear el Administrador porque ya se ha registrado previamente.</strong></div>";
                    Response.Redirect("~/Services/CrearCuenta.aspx");
                }
                Session["UsuarioStatus"] =
                    "<div class='alert alert-error' align='center'><strong>No se puede crear el usuario porque ya se ha registrado previamente. " +
                    "<br />Si crees que esto es un error ponte en contacto con el departamento de Becas.</strong></div>";
                Response.Redirect("~/Services/CrearCuenta.aspx");
            }
                // El usuario es nuevo, se registra
            else
            {
                createReader.Close();

                SecurityTools secTools = new SecurityTools();

                String PasswordSalt = secTools.SaltGenerator();
                String PasswordHash = secTools.HashPassword(ContrasenaTextBox.Text + PasswordSalt);

                if (IsSuperAdmin())
                {
                    // Se crea un Query Parametrizado
                    using (SqlCommand InsertParamQueryAdmin = new SqlCommand(
                        "INSERT \"Administradores\" VALUES (@MatriculaNominaId, @PasswordHash, @PasswordSalt, @PrimerNombre, @Apellido, 0, 1)"))
                    {
                        InsertParamQueryAdmin.Parameters.Add(new SqlParameter("@MatriculaNominaId", MatriculaNominaId));
                        InsertParamQueryAdmin.Parameters.Add(new SqlParameter("@PasswordHash", PasswordHash));
                        InsertParamQueryAdmin.Parameters.Add(new SqlParameter("@PasswordSalt", PasswordSalt));
                        InsertParamQueryAdmin.Parameters.Add(new SqlParameter("@PrimerNombre", PrimerNombreTextBox.Text));
                        InsertParamQueryAdmin.Parameters.Add(new SqlParameter("@Apellido", ApellidoTextBox.Text));

                        Int32 rowsAffectedAdmin = dbCon.ParameterizedExecuteNonQuery(InsertParamQueryAdmin);
                        dbCon.CloseConnection();
                        Session["UsuarioStatus"] =
                            "<div class='alert alert-success' align='center'><strong>Cuenta creada con &eacute;xito.</strong></div>";
                        Response.Redirect("~/Services/CrearCuenta.aspx");
                    }

                }

                String TimeStamp = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss", DateTimeFormatInfo.InvariantInfo);
                String FechaNacimiento = FechaNacimientoTextBox.Text;
                //FechaNacimiento.Replace("/", "-");
                String[] FNacimiento = FechaNacimiento.Split('/');
                FechaNacimiento = FNacimiento[2]+"-"+ FNacimiento[1]+"-"+ FNacimiento[0];
                IFormatProvider theCultureInfo = new System.Globalization.CultureInfo("es-MX", true);
                //DateTime FechaNacimientoDate = DateTime.ParseExact(FechaNacimiento, "dd-MM-yyyy", theCultureInfo);

                // Se crea un Query Parametrizado
                using (SqlCommand InsertParamQueryAlumno = new SqlCommand(
                    "INSERT \"Alumnos\" VALUES (@MatriculaNominaId, @PasswordHash, @PasswordSalt, @PrimerNombre, @Apellido, @FechaNacimiento, @FechaCreacion, 0, 1)"))
                {   
                    InsertParamQueryAlumno.Parameters.Add(new SqlParameter("@MatriculaNominaId", MatriculaNominaId));
                    InsertParamQueryAlumno.Parameters.Add(new SqlParameter("@PasswordHash", PasswordHash));
                    InsertParamQueryAlumno.Parameters.Add(new SqlParameter("@PasswordSalt", PasswordSalt));
                    InsertParamQueryAlumno.Parameters.Add(new SqlParameter("@PrimerNombre", PrimerNombreTextBox.Text));
                    InsertParamQueryAlumno.Parameters.Add(new SqlParameter("@Apellido", ApellidoTextBox.Text));
                    InsertParamQueryAlumno.Parameters.Add(new SqlParameter("@FechaNacimiento", FechaNacimiento));
                    InsertParamQueryAlumno.Parameters.Add(new SqlParameter("@FechaCreacion", TimeStamp));

                    Int32 rowsAffectedAlumn = dbCon.ParameterizedExecuteNonQuery(InsertParamQueryAlumno);

                    String alumnoMail = MatriculaNominaId + "@itesm.mx";
                    MailService EnviarMail = new MailService();
                    
                    SecurityTools sc = new SecurityTools();

                    EnviarMail.ValidationMail(alumnoMail, sc.EncodeTo64(MatriculaNominaId));
                    
                    Session["UsuarioStatus"] =
                        "<div class='alert alert-success' align='center'><strong>Se ha enviado un correo a <span style='color: #3a87ad'>" + alumnoMail + "</span> " + 
                        "<br />para que puedas activar tu cuenta y asi poder ingresar al sistema.</strong></div>";
                    dbCon.CloseConnection();
                    Response.Redirect("~/Default.aspx");
                }
            }
        }
    }


    // Verifíca si es SuperAdmin, para saber si crear una cuenta de Admin
    protected Boolean IsSuperAdmin()
    {
        return Session["SessionID"] != null && String.Equals((String)Session["SuperAdminActive"], "Active");
    }


    // Verifíca si es usuario tipo Administrador
    protected Boolean IsAdmin()
    {
        return Session["SessionID"] != null && String.Equals((String)Session["UserType"], "Administradores");
    }
}